
#include "lcd.h"
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

int fd = -1;            //屏幕的文件描述符
int * plcd = NULL;      //帧缓冲的首地址

int lcd_init()
{
    //1.打开屏幕文件
    fd = open( "/dev/fb0", O_RDWR );
    if( fd == -1 )
    {
        perror("open fb0 error ");
        return -1;
    }

    //2.内存映射 
    plcd = mmap( NULL, 1024*600*4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0 );
    if( plcd == MAP_FAILED )
    {
        perror("mmap error ");
        close( fd );
        return -1;
    }
}

void lcd_close()
{
    //1.解除映射
    munmap( plcd, 1024*600*4 );

    //2.关闭屏幕 
    close( fd );
}

//画点：在屏幕上任意的点(x,y)显示一个颜色color 
void display_point( int x, int y, int color )
{
    if( x>=0 && x<1024 && y>=0 && y<600 )
    {
        *( plcd + y*1024 + x ) = color;
    }
}

//显示一个纯色图像
void show_pure_color( int color )
{
    int i,j;
    for( j=0; j<600; j++ )
    {
        for( i=0; i<1024; i++ )
        {
            //画点 
            display_point( i, j, color );
        }
    }
}

//矩形
void display_Rectangle( int x0, int y0, int w, int h, int color )
{
    int i,j;
    for( j=0; j<600; j++ )
    {
        for( i=0; i<1024; i++ )
        {
            //矩形 
            if( i>x0 && i<x0+w && j>=y0 && j<y0+h )
            {
                //画点 
                display_point( i, j, color );
            }
        }
    }
}

//圆 
void display_Circle( int x0, int y0, int r, int color )
{
    int i,j;
    for( j=0; j<600; j++ )
    {
        for( i=0; i<1024; i++ )
        {
            //圆 
            if( (i-x0)*(i-x0) + (j-y0)*(j-y0) <= r*r )
            {
                //画点 
                display_point( i, j, color );
            }
        }
    }
}

void display_row ( int x ,int y, int x0 ,int y0,int color )
{
    int i,j,k;
    for( j=y+25; j<=y0-25; j+=50 )
    {
        for(k=j;k<j+5;k++)
        {
        for( i=x+25; i<x0-20; i++ )
        {
            
                //画点 
                display_point( i, k, color );
        }
        }
        
    }
   
}

void display_col (int x ,int y, int x0 ,int y0,int color )
{
    int i,j,k;
    for( i=x+25; i<=x0-25; i+=50 )
    {
        for(k=i;k<i+5;k++)
        {
        
        for( j=y+25; j<=y0-25; j++ )
        {
            
                //画点 
                display_point( k, j, color );
        }
        }
    }
  
}

void display_center_row ( int x ,int y )
{
    int i,j;
        for(j=y;j<y+5;j++)//五行像素点
        {
        for( i=x-25; i<=x+25; i++ )//坐标圆心左右25个像素
        {
            
                //画点 
                display_point( i, j, 0x000000 );
        }
        }
    
   
}

void display_center_col (int x ,int y )
{
      int i,j;
        for(i=x;i<x+5;i++)//五列像素点
        {
        for( j=y-25; j<=y+25; j++ )//坐标圆心左右25个像素
        {
            
                //画点 
                display_point( i, j, 0x000000 );
        }
        }
  
}

void display_center(int x ,int y)
{
    //在棋子圆心坐标用同样大小的黄色圆来覆盖
     display_Circle(  x,  y, 25,0xFFFF00);
     display_center_row ( x , y );
     display_center_col ( x , y );
}


void display_dingdian_row ( int x ,int y )
{
    int i,j;
        for(j=y;j<y+5;j++)//五行像素点
        {
        for( i=x-25; i<=x+25; i++ )//坐标圆心左右25个像素
        {
            
                //画点 
                display_point( i, j, 0x000000 );
        }
        }
    
   
}

void display_top_col (int x ,int y )
{
      int i,j;
        for(i=x;i<x+5;i++)//五列像素点
        {
        for( j=y; j<=y+25; j++ )//坐标圆心下25个像素
        {
            
                //画点 
                display_point( i, j, 0x000000 );
        }
        }
  
}

void display_top(int x ,int y)
{
    //在棋子圆心坐标用同样大小的黄色圆来覆盖
     display_Circle(  x,  y, 25,0xFFFF00);
     display_dingdian_row ( x , y );
     display_top_col ( x , y );
}



void display_bottom_col (int x ,int y )
{
      int i,j;
        for(i=x;i<x+5;i++)//五列像素点
        {
        for( j=y-25; j<=y; j++ )//坐标圆心上25个像素
        {
            
                //画点 
                display_point( i, j, 0x000000 );
        }
        }
  
}

void display_bottom(int x ,int y)
{
    //在棋子圆心坐标用同样大小的黄色圆来覆盖
     display_Circle(  x,  y, 25,0xFFFF00);
     display_dingdian_row ( x , y );
     display_bottom_col ( x , y );
}

void display_left_row ( int x ,int y )
{
    int i,j;
        for(j=y;j<y+5;j++)//五行像素点
        {
        for( i=x; i<=x+25; i++ )//坐标圆心右25个像素
        {
            
                //画点 
                display_point( i, j, 0x000000 );
        }
        }
    
   
}

void display_leftandright_col (int x ,int y )
{
      int i,j;
        for(i=x;i<x+5;i++)//五列像素点
        {
        for( j=y-25; j<=y+25; j++ )//坐标圆心上下25个像素
        {
            
                //画点 
                display_point( i, j, 0x000000 );
        }
        }
  
}

void display_left(int x ,int y)
{
    //在棋子圆心坐标用同样大小的黄色圆来覆盖
     display_Circle(  x,  y, 25,0xFFFF00);
     display_left_row ( x , y );
     display_leftandright_col ( x , y );
}

void display_right_row ( int x ,int y )
{
    int i,j;
        for(j=y;j<y+5;j++)//五行像素点
        {
        for( i=x-25; i<=x; i++ )//坐标圆心左25个像素
        {
            
                //画点 
                display_point( i, j, 0x000000 );
        }
        }
    
   
}



void display_right(int x ,int y)
{
    //在棋子圆心坐标用同样大小的黄色圆来覆盖
     display_Circle(  x,  y, 25,0xFFFF00);
     display_right_row ( x , y );
     display_leftandright_col ( x , y );
}

void display_zuoshang(int x ,int y)
{
    //在棋子圆心坐标用同样大小的黄色圆来覆盖
     display_Circle(  x,  y, 25,0xFFFF00);
     display_left_row ( x , y );
     display_top_col ( x , y );
}

void display_zuoxia(int x ,int y)
{
    //在棋子圆心坐标用同样大小的黄色圆来覆盖
     display_Circle(  x,  y, 25,0xFFFF00);
     display_left_row ( x , y );
     display_bottom_col ( x , y );
}

void display_youshang(int x ,int y)
{
    //在棋子圆心坐标用同样大小的黄色圆来覆盖
     display_Circle(  x,  y, 25,0xFFFF00);
     display_right_row ( x , y );
     display_top_col ( x , y );
}

void display_youxia(int x ,int y)
{
    //在棋子圆心坐标用同样大小的黄色圆来覆盖
     display_Circle(  x,  y, 25,0xFFFF00);
     display_right_row ( x , y );
     display_bottom_col ( x , y );
}

void huiqitianchong(int x , int y)
{ 
  
    int x1= x/50*50+25;
    int y1= y/50*50+25;
    //x/50*50+25 得到当前棋子的圆心坐标  
      if(y1<50)
     {
        if(x1<50)
        {
        printf("zuo shang x= %d ,y =%d\n",x1,y1);
         display_zuoshang(x1,y1);
        }
        else if(x1>750)
        {
             printf("youshang  x= %d ,y =%d\n",x1,y1);
             display_youshang(x1,y1);
        }
        else
        {
             printf("top  x= %d ,y =%d\n",x1,y1);
             display_top(x1,y1);
        }
     }
    else if(y1>550)
    {
        if(x1<50)
        {
             printf("zuoxia x= %d ,y =%d\n",x1,y1);
         display_zuoxia(x1,y1);
        }
        else if(x1>750)
        {
             printf("youxia x= %d ,y =%d\n",x1,y1);
        display_youxia(x1,y1);
        }
        else
        {
         printf("bottom  x= %d ,y =%d\n",x1,y1);
        display_bottom(x1,y1);
        }
    }
     else if(x1>750&&(y1>50&&y1<550))
     {
         printf("right  x= %d ,y =%d\n",x1,y1);
        display_right(x1,y1);
     }
     else if(x<150&&(y1>50&&y1<550))
     {
         printf("left   x= %d ,y =%d\n",x1,y1);
        display_left(x1,y1);
     }
     else
     {
         printf("center x= %d ,y =%d\n",x1,y1);
        display_center(x1,y1);
    }
}
